/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "基本类型.h"

#include <map>
#include <stack>

using namespace std;


extern uint32 __mg_当前ID累加值;
extern stack<uint32> __mg_ID回收站;

template <typename TID, typename T>
class C_ID名称数据容器
{
	map<TID, T>		__m_数据;
	TID				m_当前ID累加值;

	stack<TID>		__ID回收站;





	bool	m_是否使用全局数据;

public:
	C_ID名称数据容器(const bool 是否使用全局数据 = false)
		:m_当前ID累加值(0), m_是否使用全局数据(是否使用全局数据) 
	{
	}
	~C_ID名称数据容器() {

	}

	//static TID			__mg_当前ID累加值 ;
	//static stack<TID>	__mg_ID回收站;
	//uint32 f_取全局累加值();
	inline TID f_add(T obj) {
		TID ID = __mg_当前ID累加值;
		if (m_是否使用全局数据) {
			if (!__mg_ID回收站.empty()) {
				ID = __mg_ID回收站.top();
				__mg_ID回收站.pop();
			}
			else {
				++__mg_当前ID累加值;
			}

		}
		else {
			ID = m_当前ID累加值;
			if (!__ID回收站.empty()) {
				ID = __ID回收站.top();
				__ID回收站.pop();
			}
			else {
				++m_当前ID累加值;
			}

		}

		__m_数据[ID] = obj;
		return ID;
	}

	TID operator << (T& obj) {
		TID ID = __mg_当前ID累加值;
		if (m_是否使用全局数据) {
			if (!__mg_ID回收站.empty()) {
				ID = __mg_ID回收站.top();
				__mg_ID回收站.pop();
			}
			else {
				++__mg_当前ID累加值;
			}
			
		}
		else {
			ID = m_当前ID累加值;
			if (!__ID回收站.empty()) {
				ID = __ID回收站.top();
				__ID回收站.pop();
			}
			else {
				++m_当前ID累加值;
			}
			
		}
		
		__m_数据[ID] = obj;
		return ID;
	}

	void operator >> (const TID id) {
		if (__m_数据.find(id) != __m_数据.end()) {
			__m_数据.erase(id);

			if (m_是否使用全局数据) {
				__mg_ID回收站.push(id);
			}
			else {
				__ID回收站.push(id);
			}
			
		}
	}

	inline bool f_是否存在对象(const TID id) {
		if (__m_数据.find(id) != __m_数据.end()) {
			return true;
		}
		return false;
	}

	T& operator[](const uint32 id) {
		return __m_数据[id];
	}

	const map<TID, T>& f_get() { return __m_数据; }
	inline uint32 f_size() { return __m_数据.size(); }
};



